package com.saer.client.grid.diagnostico;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.saer.client.SaerEntryPoint;
import com.saer.client.constants.ClientConstants;
import com.saer.client.dto.diagnostico.VisitaDto;
import com.saer.client.grid.AutoFitListGrid;
import com.saer.client.grid.record.diagnostico.VisitaRecord;
import com.saer.client.tab.diagnostico.DiagnosticoDistanciaTab;
import com.saer.client.tab.visita.VisitaTab;
import com.saer.client.window.AlertWindow;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.widgets.grid.HeaderSpan;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.CellDoubleClickEvent;
import com.smartgwt.client.widgets.grid.events.CellDoubleClickHandler;

public class VisitaGrid extends AutoFitListGrid {

	List<VisitaDto> visitas = null;
	boolean isShowingAlert = false;
	private Timer posponeAlertTimer;
	private boolean alertPostponed = false;
	VisitaTab sourceTab = null;
	
	public VisitaGrid (VisitaTab vSourceTab) {
		
		this.sourceTab = vSourceTab;
		
		setTitle("Visitas");
		setSize("100%", "100%");
		setCanHover(null);
		setShowHover(false);
		setShowHoverComponents(false);
		setHeaderHeight(35);
		setHeaderSpanHeight(15);
		setShowEmptyMessage(true);
		setEmptyMessage("No hay solicitudes de asistencia remota");
        setShowRecordComponents(true);
		setShowRecordComponentsByCell(true);  
		setWidth(800);

		ListGridField capField = new ListGridField("cap", "CAP");
		ListGridField fechaField = new ListGridField("fecha", "Fecha Visita");
		ListGridField nombreField = new ListGridField("nombre", "Nombre");
		ListGridField apellidoField = new ListGridField("apellido", "Apellido");
		ListGridField nombrePField = new ListGridField("nombreP", "Nombre");
		ListGridField apellidoPField = new ListGridField("apellidoP", "Apellido");
		ListGridField estadoField = new ListGridField("estado", "Estado Visita");
		estadoField.setAlign(Alignment.CENTER);
		
		setFields(capField, fechaField, nombreField, apellidoField, nombrePField, apellidoPField, estadoField);
		
		setHeaderSpans(new HeaderSpan("Enfermero", new String[]{"nombre", "apellido"}),
				       new HeaderSpan("Paciente", new String[]{"nombreP", "apellidoP"}));  
  
		addCellDoubleClickHandler(new CellDoubleClickHandler() {
			public void onCellDoubleClick(CellDoubleClickEvent event) {
				VisitaDto visita = getSelectedVisita(event.getRowNum());
				
				if (visita.getEstado() == 0) {
					SaerEntryPoint.getRemotewebservice().updateStatusVisita(
							visita.getVisitaId(),
							ClientConstants.VISITA_PENDIENTE,
							new AsyncCallback<Void>() {
								public void onFailure(Throwable caught) {}
								public void onSuccess(Void result) {}
							});
					
					visita.setEstado(ClientConstants.VISITA_PENDIENTE);
					((VisitaRecord) event.getRecord()).setEstado("Pendiente");
					setEditValue(event.getRowNum(), getFieldNum("estado"), "Pendiente");
					refreshCell(event.getRowNum(), getFieldNum("estado"));
					
					newNotificationsExist();
				}

				DiagnosticoDistanciaTab tab = new DiagnosticoDistanciaTab(sourceTab);
				tab.setData(visita);
				sourceTab.getMainLayout().addTab(tab);
			}
		});
		
		posponeAlertTimer = new Timer() {
			@Override
			public void run() {
				alertPostponed = false;
				if (newNotificationsExist()) {
					new AlertWindow(VisitaGrid.this);
				}
			}
		};

	}
	
	@Override
	protected String getCellCSSText(ListGridRecord record, int rowNum, int colNum) {
		if (getFieldName(colNum).equals("estado")) {
			VisitaRecord visitaRecord = (VisitaRecord) record;
			if (visitaRecord.getEstado().equals("Nueva")) {
				return "font-weight:bold; color:white; background-color:#d64949;";
			} else if (visitaRecord.getEstado().equals("Contestada")) {
				return "font-weight:bold; color:white; background-color:green;";
			} else if (visitaRecord.getEstado().equals("Pendiente")) {
				return "font-weight:bold; color:blakc; background-color:gold;";
			} else {
				return super.getCellCSSText(record, rowNum, colNum);
			}
		} else {
			return super.getCellCSSText(record, rowNum, colNum);
		}
	}
	
	public void setData(List<VisitaDto> visitas) {
		this.visitas = visitas;
		
		ArrayList<VisitaRecord> visitaRecordList = new ArrayList<VisitaRecord>();
		
		for (VisitaDto visita : visitas) {
			visitaRecordList.add(new VisitaRecord(
					visita.getDescripcionCap(),
					visita.getFecha(),
					visita.geteNombre(),
					visita.geteApellido(),
					visita.getpNombre(),
					visita.getpApellido(),
					visita.getEstado() == 0 ? "Nueva" : visita.getEstado() == 1 ? "Pendiente" : "Contestada"));
		}
		
		setData(visitaRecordList.toArray(new VisitaRecord[visitaRecordList.size()]));
		
		if (newNotificationsExist() && !isShowingAlert && !alertPostponed) {
			isShowingAlert= true;
			new AlertWindow(this);
		}
	}
	
	private VisitaDto getSelectedVisita(int row) {
		return this.visitas.get(row);
	}
	
	private VisitaRecord getVisitaRecord(int row) {
		return (VisitaRecord) (this.getRecords())[row];
	}
	
	public void cambiarEstadoVisita(int visitaId, int estado) {
		int index = 0;
		for (VisitaDto visita : visitas) {
			if (visita.getVisitaId() == visitaId) {
				visita.setEstado(estado);
				break;
			}
			index++;
		}

		VisitaRecord visitaRecord = getVisitaRecord(index);

		if (estado == ClientConstants.VISITA_NUEVA) {
			visitaRecord.setEstado("Nueva");
			setEditValue(index, getFieldNum("estado"), "Nueva");
		} else if (estado == ClientConstants.VISITA_PENDIENTE) {
			visitaRecord.setEstado("Pendiente");
			setEditValue(index, getFieldNum("estado"), "Pendiente");
		} else {
			visitaRecord.setEstado("Contestada");
			setEditValue(index, getFieldNum("estado"), "Contestada");
		}

		refreshCell(index, getFieldNum("estado"));
	}
	
	private boolean newNotificationsExist() {
		for (VisitaDto visita : visitas) {
			if (visita.getEstado() == 0) {
				sourceTab.showWarningIcon("Hay solicitudes de asistencia remota sin responder");
				return true;
			}
		}
		sourceTab.removeWarningIcon();
		return false;
	}
	
	public void openOldestNewVisita(AlertWindow alertWindow) {
		int row = 0;
		for (VisitaDto visita : visitas) {
			if (visita.getEstado() == 0) {
				SaerEntryPoint.getRemotewebservice().updateStatusVisita(
						visita.getVisitaId(),
						ClientConstants.VISITA_PENDIENTE,
						new AsyncCallback<Void>() {
							public void onFailure(Throwable caught) {}
							public void onSuccess(Void result) {}
						});
				
				alertWindow.destroy();
				
				visita.setEstado(ClientConstants.VISITA_PENDIENTE);
				getVisitaRecord(row).setEstado("Pendiente");
				setEditValue(row, getFieldNum("estado"), "Pendiente");
				refreshCell(row, getFieldNum("estado"));
				
				newNotificationsExist();

				DiagnosticoDistanciaTab tab = new DiagnosticoDistanciaTab(sourceTab);
				tab.setData(visita);
				sourceTab.getMainLayout().addTab(tab);
				
				return;
			}
			row++;
		}
	}

	public void setIsShowingAlert(boolean isShowingAlert) {
		this.isShowingAlert = isShowingAlert;
	}
	
	public void postponeAlert(int seg) {
		if (seg > 0) {
			alertPostponed = true;
			posponeAlertTimer.schedule(seg * 1000);
		} else {
			alertPostponed = false;
			posponeAlertTimer.cancel();
		}
	}
	
	@Override
	public void destroy() {
		posponeAlertTimer.cancel();
		super.destroy();
	}
}
